{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 查看数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-2-a34a30334354>:1: read_data_sets (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:260: maybe_download (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please write your own downloading logic.\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/base.py:252: _internal_retry.<locals>.wrap.<locals>.wrapped_fn (from tensorflow.contrib.learn.python.learn.datasets.base) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use urllib or similar directly.\n",
      "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:262: extract_images (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:267: extract_labels (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.data to implement this functionality.\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:110: dense_to_one_hot (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use tf.one_hot on tensors.\n",
      "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "WARNING:tensorflow:From /Applications/anaconda3/envs/tensorflow36/lib/python3.6/site-packages/tensorflow/contrib/learn/python/learn/datasets/mnist.py:290: DataSet.__init__ (from tensorflow.contrib.learn.python.learn.datasets.mnist) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Please use alternatives such as official/mnist/dataset.py from tensorflow/models.\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构造训练网络"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-4-c3cdf17eeaaf>:53: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "\n",
      "Future major versions of TensorFlow will allow gradients to flow\n",
      "into the labels input on backprop by default.\n",
      "\n",
      "See @{tf.nn.softmax_cross_entropy_with_logits_v2}.\n",
      "\n",
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "# None为没被确定的batchsize\n",
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')\n",
    "\n",
    "# 把图片展开成的一维向量还原为二维图像\n",
    "x_image = tf.reshape(x, [-1, 28, 28, 1])\n",
    "\n",
    "# 定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积， padding方式选择valid，\n",
    "# 所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。 本层卷积的激活函数为relu。\n",
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)\n",
    "    \n",
    "# 接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6.\n",
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')\n",
    "    \n",
    "# 接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "# padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。\n",
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)\n",
    "    \n",
    "# 再进行一次stride为2的最大池化，输出为4x4,深度16。\n",
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')\n",
    "    \n",
    "# 池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。\n",
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)\n",
    "    \n",
    "\"\"\"\n",
    "对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout， 所以验证时候的keep_prob是1.0。\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。\n",
    "\"\"\"\n",
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)\n",
    "    \n",
    "# 接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, \n",
    "# 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_https://ssxd.mediav.com/s?type=2&r=20&mv_ref=mini.360.cn&enup=CAAB30dExggAAsZER98A&mvid=Mzk1NjQ5ODIzMTUzNDE3MDYwMzAwMTc&bid=134426d7c797f005&price=AAAAAFyqud8AAAAAAAPUJ0k8ATjLTPbzdM8mDQ==&finfo=DAABCAABAAAFkAgAAgAAAZMEAAM/aCZa4AAAAAAIAAIAAAADCgADE6d2Ow/GgOIIAAQAAAHjCgAJAAAAAAAAUJQGAAoAAAYADRszCAAOAAAAXgoADwAAAAAA2UkAAA&ugi=FYaQehWulltMFQIVKBUoFQAAFe/88MgIFoQIFcgBFoDX16qC/8IFAA&uai=FZjrfiUCFQIWqPHVqOTItqcnFfIHJeTA/ukOJQAVEhQIHBaOoPHg5JHjrpwBFQAAAA&ubi=FfygGxWewMMCFZLSnhcV1OymWBUGFQIW2tuFwhMWqPHqj+6Ou6cnNAIWqMICJQYV786q8A0VpgEVADaz57nl4OCRpukBAA&clickid=0&cpx=__OFFSET_X__&cpy=__OFFSET_Y__&cs=__EVENT_TIME_START__&ce=__EVENT_TIME_END__&csign2=k2_6rylQ8d1=&url=http%3A%2F%2Fbj.huluo.com%2F214%2FBJ%2Fpc%2Fa1gt2w%2Findex.html%3Fplan_id%3D558160%26creative_id%3DBJ63182entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.425096, the validation accuracy is 0.8848\n",
      "after 200 training steps, the loss is 0.208798, the validation accuracy is 0.9552\n",
      "after 300 training steps, the loss is 0.211924, the validation accuracy is 0.9638\n",
      "after 400 training steps, the loss is 0.0934154, the validation accuracy is 0.973\n",
      "after 500 training steps, the loss is 0.105029, the validation accuracy is 0.9728\n",
      "after 600 training steps, the loss is 0.0999393, the validation accuracy is 0.975\n",
      "after 700 training steps, the loss is 0.0382218, the validation accuracy is 0.9748\n",
      "after 800 training steps, the loss is 0.120208, the validation accuracy is 0.9734\n",
      "after 900 training steps, the loss is 0.0606053, the validation accuracy is 0.9778\n",
      "after 1000 training steps, the loss is 0.118577, the validation accuracy is 0.9762\n",
      "after 1100 training steps, the loss is 0.0933551, the validation accuracy is 0.9828\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9818\n"
     ]
    }
   ],
   "source": [
    "# softmax得到概率分布并输出准确率\n",
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n",
    "\n",
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "# saver用于保存或恢复训练的模型\n",
    "saver = tf.train.Saver()\n",
    "\n",
    "# 以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。\n",
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and (i+1) % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i+1, loss, validate_accuracy))\n",
    "            saver.save(sess, './models_save/model.ckpt', global_step=i+1)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./models_save/model.ckpt-1100\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./models_save/')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 心得体会与总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "整个卷积神经网络的构造，包括输入输出已经掌握，但是卷积操作手写代码实现有点困难，一直报错，找不到原因。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**下面总结一下LeNet-5模型网络结构：**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 输入层：LeNet模型的输入层是一个32x32的单通道图像，即灰度图，比MNIST数据集中最大的字母还要大，便于潜在的明显特征能够出现在最高层特征监测感受野的中心。\n",
    "* C1层：卷积层，一共包含6个特征图。卷积核尺寸5x5，步长为1，padding的方式为VALID，所以特征图像的尺寸为28x28像素。\n",
    "* S2层：为下采样层，也叫池化层，每个单元与C1所对应的特征图上2x2像素的区域连接，这四个输入相加后乘以一个可训练的系数，再加上一个可训练的偏置量后应用Sigmoid函数，2x2像素的感受野不重叠，所以S2的特征图尺寸为14x14像素。\n",
    "* C3层：卷积层，一共包含16个特征图。因为卷积核的尺寸为 5x5，步长为1，padding的方式为VALID，根据公式可算出，其最后的宽高均为（14-5）/1+1=10像素，最后得到的结果为10x10像素的特征图尺寸。\n",
    "* S4层：池化层，每个单元与C3所对应的特征图上2x2像素的区域连接，这四个输入相加后乘以一个可训练的系数，再加上一个可训练的偏置量后应用Sigmoid函数进行激活，此时2x2像素的感受野不重叠，所以S4的特征图尺寸为5x5像素。\n",
    "* C5层：卷积层，一共包含120个特征图，每个单元连接到S4所有特征图上的5x5区域。因为卷积核尺寸为5x5，步长为1，padding方式为VALID，根据公式算出最后的宽和高均为（5-5）/1 + 1 = 1，得到1x1的特征图尺寸。\n",
    "* F6层：全连接层，共包含84个神经元，将该层的输入与权重做点乘积，然后加上偏置量后应用Sigmoid函数进行压缩。\n",
    "* 输出层：包含了10个神经元，分别对应于10种分类结果。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 二、卷积带来的特性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 局部相关性\n",
    "    - 相邻的像素结合起来表达一个特征，距离较远的像素影响较小\n",
    "    - 随着层数的增加，feature map里面的点映射到原图的感受野越来越大\n",
    "    - 不仅仅可以适用于图像，其他具有局部相关性的数据均可以尝试卷积网络处理\n",
    "    - 带来一定的遮挡不变性\n",
    "* 参数共享\n",
    "* 平移宽容\n",
    "    - 在任何位置都可以激活神经元\n",
    "* 缩放宽容\n",
    "    - 一定程度内的图像缩放不会产生太大干扰\n",
    "* 少许降维\n",
    "    - $(H,W)_output = ((H,W)_input - (H,W)kernel + padding*2)/stride + 1$\n",
    "    - 例如:10x10的图像，用5x5的卷积核，采用valid方式(padding=0)，stride=2 输出feature map为: floor((10 – 5 + 0*2)/2) + 1 = 3 x 3\n",
    "* 对输入的尺寸不做要求\n",
    "    - 全连接里面，权重w的尺寸是由输入决定的\n",
    "    - 卷积核的尺寸只与网络设计有关，与输入没有任何关系\n",
    "    - 卷积核固定的情况下，feature的尺寸是随着输入变化的\n",
    "* 局部相关性\n",
    "* 位置不变性\n",
    "* 降低了模型参数，运算量，复杂度（泛化能力）。\n",
    "* CNN适用任意尺度的输入，对图片尺寸依赖度比较小"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 三、为什么卷积的效果要比全连接网络好？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1、具备局部相关性，全连接各个输入相互独立；\n",
    "2、大大降低输入维度，降低计算量，防止过拟合；"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 四、对模型结构的理解。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1、神经网络的搭建：\n",
    "搭建卷积：\n",
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(x_image,6,\n",
    "[5,5],padding='VALID',activation_fn=tf.nn.relu)\n",
    "搭建池化：\n",
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1,[2,2],stride=[2,2],padding='VALID')\n",
    "全连接神经网络搭建：\n",
    "with tf.name_scope('fc1'):\n",
    "    S4_flat=tf.contrib.slim.flatten(S4)#带深度数据展开成一维\n",
    "    C5 = tf.contrib.slim.fully_connected(S4_flat,120,activation_fn=tf.nn.relu)\n",
    "对某一层进行dropout：\n",
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob',dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6,keep_prob)\n",
    "需定义及声明的有：\n",
    "输入数据：x = tf.placeholder(\"float\",[None,784],name='x')\n",
    "输出数据：y = tf.placeholder('float',[None,10],name='y')\n",
    "交叉熵损失函数：\n",
    "#定义了交叉熵损失函数，注意输入为  未经激活的上层输出\n",
    "cross_entropy_loss=tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=y))\n",
    "定义正则项：\n",
    "#获取L2正则项\n",
    "l2_loss=tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "目标函数：\n",
    "#得到目标函数\n",
    "total_loss = cross_entropy_loss+7e-5*l2_loss\n",
    "定义优化器：\n",
    "#定义优化器.并进行损失函数最小值计算\n",
    "optimizer =\n",
    "tf.train.GradientDescentOptimizer(learning_rate=0.3).minimize(total_loss)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
